// JavaScript Document		
// 	
// 物体类. 包含一个边界框和一个坐标框以及绘图函数
// 另外要完善的是继承类型
function Sprite(pV, bR)
{
    var _this = this;
	_this.position = pV;
	_this.box = bR;

	_this.draw = function() {}
	_this.update = function() {}
}




//  最基本的场景节点类, 包含一个指向Sprite类的指针sprite
function SceneNode(obj, prior){
	var _this = this;
	_this.sprite = null;
	// 使用默认的Vector和Rectangle用来保证node的有效性
	// 即使没有传入obj
	_this.position = new Vector2(0,0);
	_this.box	= new Rectangle(0,0);
	// 画图的优先级控制, 优先级别越高 越先画
	// 　Dango < 坏掉的Brick < Brick < Background
	//    1   <     2   <    3   <  4
	_this.priority = 0;
	// 传入Canvas的context
	_this.draw = function(canvas){
		_this.sprite.draw(canvas);
	}
	
	function init()
	{
		_this.sprite = obj;
		_this.priority = prior;
		_this.position = _this.sprite.position;
		_this.box	= _this.sprite.box;
	}
	init();
}
	

// SceneManager对象 控制绘图. 传入的参数分别为画布的宽高和canvas和Context
function SceneManager(Width, Height, cvs) {
	var _this = this;
	_this.canvas = cvs;
	_this.context = cvs.getContext("2d");
	
	// 保存画布长宽
	_this.mWidth = Width;
	_this.mHeight = Height;

	// NodeList是一个按y坐标从小到大排列的数组,绘图时从小画到大.
	// 主要画Sprite
	_this.SeceneNodeList = new Array();

	_this.createNode = function(sprite, prior){
		var node = new SceneNode(sprite,prior);
		return node;
	}
	// 添加节点
	_this.addNode = function(node){
		// 按照优先级大到小的顺序填入
		// 插入算法
		// for(从SceneNodeList前面到后面, ++i)
		//    if(node.priority > SceneNodeList[i]). 
		//			SceneNodeList.insert();
		//this.SceneNode.push(node);
		var i
		if(_this.SceneNodeList.length < 2)
		{
			if(node.priority >= _this.SceneNodeList[0].priority)
				_this.SceneNodeList.push(node);
			else
				_this.SceneNodeList.unshift(node);
		}
		else{
			for(i = 0; i < _this.SceneNodeList.length - 1; ++i)
			{
				if(node.priority >= _this.SceneNodeList[i].priority
				&& node.priority < _this.SceneNodeList[i+1].priority)
					break;
			}
			// insertAt方法... 经测试就是这么用- -....Tm淡疼..
			_this.SceneNodeList = _this.SceneNodeList.insertAt(i+1, node);
		}
	}
	

	
	// 删除一个不需要画的物体.
	_this.deleteNodeWith = function(sp){
		for(var i = 0; i < _this.SceneNodeList.length; ++i)
		{
			if(_this.SceneNodeList[i].sprite === sp)
			{
				_this.SceneNodeList = _this.SceneNodeList.removeAt(i+1);
				return;
			}
		}
	}
	
	_this.clearNodeList = function()
	{
		while(_this.SceneNodeList.length > 1)
		{
			_this.SceneNodeList.pop();
		}
	}
	
	
	_this.draw = function() {
		// 按照优先级从大到小绘制就可以了.
		// 也就是说从NodeList的尾部画到前部
		// for(从后面到前面)
		//     SceneNodeList[i].sprite.draw(this.context);
		_this.context.clearRect(0,0,_this.canvas.width, _this.canvas.height);
		//_this.context.scale(0.5,0,5);
		
		for(var i = _this.SceneNodeList.length; i  >  0; --i)
		{
			_this.SceneNodeList[i-1].draw(_this.canvas);
		}
		
	}
	// 供DangoJump程序类调用
	_this.ready = function() {
		return true;
	}
	
	
	
	var init = function(){
		_this.SceneNodeList = new Array();
		// 提供一个空节点
		var s = new Sprite(new Vector2(0,0), new Vector2(0,0), new Rectangle(0,0));
		// 使用最小的优先级, 虽然这个节点的绘图什么都不做
		var n = new SceneNode(s,0);
		_this.SceneNodeList.push(n);
	}
	
	init();
}




